#include <string>
#include "GeneradorDeListadoDeDirectorio.h"
#include "RutasDocumentos.h"
#define SALIDA_PARSER "/salidaParser.dat"
#define TAM_BUFFER_SECUNDARIO 100000
#define TAM_BUFFER_PRINCIAL 20000000
#define BUFFER_LEVANTAR 100000000
#define LONG_TERMINO_MAX 40
#ifndef PARSER_H_
#define PARSER_H_


/*
 * Estructura utilizada para manipular los terminos
 */
struct Termino_Parseado {
	unsigned short int doc;
	char termino[LONG_TERMINO_MAX];
};

class Parser {
public:
	Parser();
	virtual ~Parser();

	/*Parsea el archivo con el path de entrada, generando una salida con los terminos del mismo
	 * respetando la estructura Termino_Parseado
	 */
	void parsear(const std::string &path_entrada, unsigned short int doc);


	/* Levanta los terminos del path de entrada, almacenandolos en un array de Terminos_Parseados
	 * Devuelve el puntero al comienzo de este array en la variable terminos_parseados.
	 * Tambien devuelve en size la cantidad de terminos parseados
	 * Retorna true si ya se proceso todo el archivo de entrada, en caso contrario devuelve false
	 */
	bool levantarTerminos(const std::string &path_entrada, int* size, Termino_Parseado* &terminos_parseados);


	/* Levanta el archivo del path de entrada, desde el byte desde hasta el byte hasta del mismo
	 *  size la cantidad de terminos leidos. Retorna un puntero al comienzo del array de terminos
	 *  parseados
	 */
	Termino_Parseado* levantar(const std::string &path_entrada, int* size, int byte_desde, int byte_hasta);


	/*Ejecuta el parser en el directorio pedido, recorriendo cada uno de los archivos del mismo
	 * y llamando en cada caso al metodo parsear. Todos los terminos parseados del directorio
	 * se graban en el path_terminos
	 */
	void ejecutarParser(const std::string &directorio, const std::string &path_terminos);


	/* Devuelve el path donde guardo los terminos parseados
	 *
	 */
	std::string getPathTerminos();

private:
	//Path donde se almacenaran los terminos parseados
	std::string path_terminos;
	//Puntero al archivo de salida de los terminos
	FILE* salida;
	//Cantidad de docs procesados
	int cantidad_doc;
	//Posicion actual del archivo de terminos donde se esta leyendo
	int pos_parseada;
	//Tamanio restante a levantar del archivo de terminos
	int tamanio_a_levantar;
};

#endif /* PARSER_H_ */
